package cn.com.zero.front.auth.mapper;

import cn.com.zero.api.auth.vo.LockedUserVO;
import cn.com.zero.api.auth.vo.OnlineUserVO;
import cn.com.zero.common.auth.security.po.AuthUserPO;
import cn.com.zero.common.auth.security.po.ErrorLoginLogPO;
import cn.com.zero.common.auth.security.po.LoginLogPO;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * @author xiongxj
 * @version 1.0.0
 * @Description 用户登录操作mapper接口
 * @createTime 2023/3/15 14:53
 */
@Repository
@Mapper
public interface IUserLoginMapper {

    /**
     * 根据手机号查询用户
     *
     * @param encryptMobile 手机号
     * @return 用户信息
     */
    AuthUserPO getUserByMobile(@Param("encryptMobile") String encryptMobile);

    /**
     * 根据用户名查询用户
     *
     * @param userName 用户名
     * @return 用户信息
     */
    AuthUserPO getUserByName(@Param("userName") String userName);

    /**
     * 根据指定用户id集合获取在线用户的详细信息
     *
     * @param userIds 在线用户的id列表
     * @return 在线用户详细信息，key用户ID，value：在线用户详细信息
     */
    @MapKey("userId")
    Map<String, OnlineUserVO> getOnlineUsersDetailInfo(@Param("list") List<String> userIds);

    /**
     * 根据指定用户id集合获取锁定用户的详细信息
     *
     * @param userIds 被锁定用户的id列表
     * @return 锁定用户详细信息，key用户ID，value：锁定用户详细信息
     */
    @MapKey("userId")
    Map<String, LockedUserVO> getLockedUsersDetailInfo(@Param("list") List<String> userIds);

    /**
     * 登录后更新用户信息
     *
     * @param userPO 待更改的用户信息
     */
    void modifyUserInfo(AuthUserPO userPO);

    /**
     * 添加错误登录日志
     *
     * @param errorLoginLogPO 错误登录日志
     */
    void addUserErrorLoginLog(ErrorLoginLogPO errorLoginLogPO);

    /**
     * 查询用户登录错误次数
     *
     * @param userId 用户ID
     * @return 次数
     */
    int getErrorLoginTimes(@Param("userId") String userId);

    /**
     * 删除用户登录错误日志
     *
     * @param userId 用户ID
     * @return 修改数据条数
     */
    Integer deleteErrorLoginLog(@Param("userId") String userId);

    /**
     * 添加登录日志
     *
     * @param loginLogPO 登录日志
     */
    void addUserLoginLog(LoginLogPO loginLogPO);
}
